# --- 基本项目设置 ---
cmake_minimum_required(VERSION 3.20)
project(CoroutineTest VERSION 1.0.0 LANGUAGES CXX)

# --- 1. 设置 C++ 标准 (推荐在目标上设置) ---
# 将 C++ 标准作为目标的属性，而不是全局变量，这更具模块化
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# --- 2. 输出目录设置 (必须在add_executable之前) ---
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# --- 3. 源文件管理 (推荐显式列出) ---
# 使用 file(GLOB) 是一个常见的反模式，因为当您添加或删除源文件时，
# 构建系统不会自动感知，除非您重新运行 CMake。显式列出文件更健壮。
set(SOURCES
    src/main.cpp
    src/coroutines/Delay.cpp
    src/coroutines/HelloWorld.cpp
    src/coroutines/UE5Coro.cpp
    src/coroutines/CppReferenceStandard.cpp
)
set(HEADERS
    include/coroutines/Delay.h
    include/coroutines/HelloWorld.h
    include/coroutines/UE5Coro.h
    include/utils/CoutTabber.h
    include/coroutines/CppReferenceStandard.h
)

add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
source_group("Source Files" FILES ${SOURCES})
source_group("Header Files" FILES ${HEADERS})

# --- 3. 头文件目录管理 (现代方式) ---
# 使用 target_include_directories 可以精确地为某个目标指定其头文件路径。
# 这比旧的 include_directories() 命令更好，因为它避免了污染其他目标的包含路径。
target_include_directories(${PROJECT_NAME} PUBLIC
    "${CMAKE_CURRENT_SOURCE_DIR}/include"
)

# --- 4. 编译选项管理 (现代方式) ---
# 使用 target_compile_options 为特定目标添加编译选项。
# 这不会覆盖 CMake 为不同构建类型（Debug/Release）自动生成的默认标志。
# 这是修复您问题的关键点！
if(MSVC)
    # /W4: 更高的警告等级
    # /permissive-: 更严格的标准符合性检查
    # /EHsc: 指定C++异常处理模型
    # /wd4702: 禁用"无法访问的代码"警告（在协程中抛出异常的情况下是预期的）
    target_compile_options(${PROJECT_NAME} PRIVATE /W4 /permissive- /EHsc /utf-8 /wd4702)
else()
    target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic)
endif()

# --- 5. 输出目录设置已移到前面 ---


# --- 6. 移除不必要的 Debug 判断 ---
# 您之前添加的 if(CMAKE_BUILD_TYPE STREQUAL "Debug") 已被移除。
# 为什么？因为 CMake 已经内置了对构建类型的完美支持！
# 当您通过 -DCMAKE_BUILD_TYPE=Debug 配置项目时，CMake 会自动为 MSVC 添加
# /MDd /Zi /Ob0 /Od 等调试标志，其中 /Zi 就是生成调试信息（.pdb 文件）的关键。
# 您的旧脚本没有添加这些，而新的脚本通过不干预 CMake 的默认行为，使其能够正确工作。

# --- 打印配置信息 (用于诊断) ---
message(STATUS "Project: ${PROJECT_NAME}")
message(STATUS "Version: ${PROJECT_VERSION}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE} (Ensure this is 'Debug' for debugging!)")